package com.tsyz.servlet.service.impl;

import com.alibaba.fastjson2.JSON;
import com.tsyz.servlet.dao.UserDao;
import com.tsyz.servlet.domain.bo.req.UserFindByUserNameReqBO;
import com.tsyz.servlet.domain.bo.req.UserGetUserByIdReqBO;
import com.tsyz.servlet.domain.bo.req.UserUpdateUserReqBO;
import com.tsyz.servlet.domain.bo.resq.UserFindAllRespBO;
import com.tsyz.servlet.domain.bo.resq.UserFindByUserNameRespBO;
import com.tsyz.servlet.domain.bo.resq.UserGetUserByIdRespBO;
import com.tsyz.servlet.domain.dto.req.UserDeleteUserReqDTO;
import com.tsyz.servlet.domain.dto.req.UserFindByUserNameReqDTO;
import com.tsyz.servlet.domain.dto.req.UserGetUserByIdReqDTO;
import com.tsyz.servlet.domain.dto.req.UserUpdateUserReqDTO;
import com.tsyz.servlet.domain.dto.resq.UserFindAllRespDTO;
import com.tsyz.servlet.domain.dto.resq.UserFindByUserNameRespDTO;
import com.tsyz.servlet.domain.dto.resq.UserGetUserByIdRespDTO;
import com.tsyz.servlet.domain.mapstruct.*;
import com.tsyz.servlet.domain.po.UserPO;
import com.tsyz.servlet.exception.BusinessException;
import com.tsyz.servlet.exception.ErrorEnumCode;
import com.tsyz.servlet.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 获取所有用户信息。
     *
     * @return 所有用户的列表。
     */
    @Override
    public List<UserFindAllRespDTO> findAll() {
        List<UserFindAllRespBO> respBOList = userDao.findAll();
        return UserFindAllRespDTOMapper.INSTANCE.boToDto(respBOList);
    }

    /**
     * 根据用户ID获取用户信息
     *
     * @param reqDTO 用户ID
     * @return 对应ID的用户对象
     */
    @Override
    public UserGetUserByIdRespDTO getUserById(UserGetUserByIdReqDTO reqDTO) {
        UserGetUserByIdReqBO reqBO = UserGetUserByIdReqBOMapper.INSTANCE.dtoToBo(reqDTO);
        UserGetUserByIdRespBO respBO = userDao.getUserById(reqBO);
        return UserGetUserByIdRespDTOMapper.INSTANCE.boToDto(respBO);
    }

    /**
     * 更新用户信息
     *
     * @param userUpdateUserReqDto 要更新的用户对象
     * @return 更新后的用户对象
     */
    @Override
    public UserPO updateUser(UserUpdateUserReqDTO userUpdateUserReqDto) {
        UserUpdateUserReqBO reqBo = UserUpdateUserReqBOMapper.INSTANCE.dtoToBo(userUpdateUserReqDto);
        return userDao.updateUser(reqBo);
    }

    /**
     * 创建新用户
     *
     * @param userPo 用户对象
     * @return 创建后的用户对象
     */
    @Override
    public UserPO createUser(UserPO userPo) {
        return userDao.createUser(userPo);
    }

    /**
     * 根据用户ID删除用户信息
     *
     * @param reqDto 用户ID
     * @return 删除是否成功
     */
    @Override
    public boolean deleteUser(UserDeleteUserReqDTO reqDto) {
        UserGetUserByIdReqBO reqBo = UserGetUserByIdReqBOMapper.INSTANCE.dtoToBo(reqDto);
        return userDao.deleteUser(reqBo);
    }

    /**
     * 根据用户名查找用户信息。
     *
     * @param reqDTO 用户名。
     * @return 对应的用户对象。
     */
    @Override
    public UserFindByUserNameRespDTO findByUserName(UserFindByUserNameReqDTO reqDTO) {
        UserFindByUserNameReqBO reqBo = UserFindByUserNameReqBOMapper.INSTANCE.dtoToBo(reqDTO);
        UserFindByUserNameRespBO respBO = userDao.findByUserName(reqBo);
        UserFindByUserNameRespDTO respDTO = UserFindByUserNameRespDTOMapper.INSTANCE.boToDto(respBO);
        if (respDTO == null) {
            log.error("登录失败：用户 {} 不存在", JSON.toJSONString(reqDTO));
            throw new BusinessException(ErrorEnumCode.BUSINESS_ERROR);
        }
        if (!checkPassword(respDTO.getPassword(), respDTO.getPassword())) {
            log.error("登录失败：用户 {} 密码错误", JSON.toJSONString(reqDTO));
            throw new BusinessException(ErrorEnumCode.BUSINESS_ERROR);
        }
        if (1 == respDTO.getIsDelete()) {
            log.error("登录失败：用户 {} 已被禁用", JSON.toJSONString(reqDTO));
            throw new BusinessException(ErrorEnumCode.BUSINESS_ERROR);
        }
        return respDTO;
    }

    /**
     * 检查两个密码是否匹配。
     *
     * @param password  第一个密码。
     * @param password1 第二个密码。
     * @return 如果两个密码相同，返回 true；否则返回 false。
     */
    @Override
    public boolean checkPassword(String password, String password1) {
        return userDao.checkPassword(password, password1);
    }
}
